#!/usr/bin/env python3
#-*- encoding:utf-8 -*-

"""
文件功能： SSE Client SDK, 用于接收、回应SSE消息
作者: arthur.chen@huawei.com
函数：
   1. loop(): 
     a) 与 SSE 服务器建立长连接 （web service 和 SSE Server 在同一个地址上提供服务）
     b) 当SSE 服务器有消息发送时， 能回调注册的函数进行消息处理（比如交给AI处理）
     c) 能通过向 reply url发送的方式， 把回应消息发送会 web service 的 reply 接口，从而转发给微信公众号
   2. parse_message():  从消息中解析出 to_user, from_user, content
   3. reply_message():  向web service发送回应消息
"""


from sseclient import SSEClient
import requests
import json

class ANESSEClient:

	def __init__(self, sse_url, reply_url, callback):
		# SSE Server地址
		self.sse_url = sse_url
		# 回复消息的地址
		self.reply_url = reply_url
		# 回调函数（当获取到新消息后，ANESSEClient会回调此函数进行处理）
		self.callback = callback

	def loop(self):
		print("sse client is waiting for messages ...")

		# 建立SSEClient
		self.client = SSEClient(self.sse_url)
		for msg in self.client:
			# step1：获取并解析消息
			to_user, from_user, content, event = self.parse_message(msg)
			if to_user is None:
				continue
			self.print_message(to_user, from_user, content)
	
			# step2：回调函数处理
			to_user, from_user, reply = self.callback(to_user, from_user, content)
			#reply = reply.encode('utf-8')

			# step3：把处理后的消息返回给web service
			self.reply_message(to_user, from_user, reply)
			self.print_message(to_user, from_user, reply)

	""" 解析web service发来的消息
	@param msg： json格式的消息，msg.event 获得事件类别， msg.data 获得数据
	@return： to_user, from_user, content, event
	"""
	def parse_message(self, msg):
		print(f"event:{msg.event} \ndata:{msg.data}")
		event = msg.event
		#  接收消息格式： {'to_user': '返回给谁',  'from_user':'来自谁', 'content': '返回信息'}
		try:
			data = json.loads(msg.data)
		except json.JSONDecodeError as e:
			print("JSONDecodeError:", e)
			return None, None, None, None
		to_user = data.get('to_user')
		from_user = data.get('from_user')
		content = data.get('content')
		return  to_user, from_user, content, event

	
	""" 向web service发送回应消息
	@param to_user: 发给谁
	@param from_user: 由谁发出
	@param content:  发送的内容
	@return： True 成功，  False 失败	
	"""
	def reply_message(self, to_user, from_user, content):
		#   返回消息格式： {'to_user': '返回给谁',  'from_user':'来自谁', 'content': '返回信息'}
		message = {'to_user': to_user, 'from_user': from_user, 'content': content }
		headers = {'Content-Type': 'application/json' }
		response = requests.post(self.reply_url, data=json.dumps(message), headers=headers)
		return response.status_code == 200 or response.status_code == 204

	""" 打印消息
	@param to_user: 发给谁
	@param from_user: 由谁发出
	@param content:  发送的内容
	"""
	def print_message(self, to_user, from_user, content):
		print(f'to: {to_user},  from: {from_user},  content: {content}')
